package com.tencent.externalstoragebar.evetntools;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import androidx.annotation.Nullable;

import java.util.TreeSet;

public abstract class TouchListenSever extends Service implements GlobalTouchListener {

    //服务是否启动
    public static boolean severIsAction=false;

    //触摸事件数组,这个数组公开,且只有一个
    public static OneEvent[] allEvent=new OneEvent[10];

    //当前处理的触摸事件索引(默认0,更换槽位时要用)
    public static int index=0;

    //可以用的触摸事件索引数组,存放当前可以用的所有索引
    public static TreeSet<Integer> indexSet=new TreeSet<>();
    //准备抬起的集合
    public static TreeSet<Integer> readyUp=new TreeSet<>();

    //是否抬起
    public static boolean isUp=false;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //Log.d("acl","???");
        return null;
    }

    //每次服务启动时调用
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Log.d("acl","启动了服务");
        //调用启动监听方法(如果服务没有启动的话)
        init();
        if (!severIsAction){
            //启动接口中线程
            action();
            severIsAction=true;
        }

        return super.onStartCommand(intent, flags, startId);
    }

    //服务创建时调用
    @Override
    public void onCreate() {
        super.onCreate();
        //Log.d("acl","服务创建");
    }

    //服务消耗时调用
    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    //这个方法表示拿到数据后干嘛
    @Override
    public void usageData(String line) {
        analyticData(line);

    }

    //解析数据方法(解析到当前的事件数组)
    private void analyticData(String str){

        //解析到报告时将释放可用变成true
        //判断情况
        if (str.contains(AnalyticData.strId)) {
            //是触摸手指id相关的
            if (str.contains(AnalyticData.strIdEnd)){
                //如果是id结束标记,将当前指向的触摸事件销毁
                readyUp.add(index);
                //状态变为抬起
                allEvent[index].setEvent(OneEvent.IS_UP);
            }else if (str.contains(AnalyticData.strId)){
                //记录当前手指的id
                int id=getDataValue(str,AnalyticData.strId);
                allEvent[index].setId(id);
                //此id手指变成按下
                allEvent[index].setEvent(OneEvent.IS_DOWN);
            }

        } else if (str.contains(AnalyticData.strSlot)) {
            //哪个手指的槽位,更新当前指向的槽位
            index=getDataValue(str,AnalyticData.strSlot);
            //更新当前槽位的槽位
            allEvent[index].setIndex(index);
            indexSet.add(index);

        } else if (str.contains(AnalyticData.strX)) {
            //x坐标,更新当前指向的触摸事件x坐标
            allEvent[index].setX(getDataValue(str,AnalyticData.strX));
            //还要更新状态为滑动

        } else if (str.contains(AnalyticData.strY)) {
            //y坐标,更新当前指向的触摸事件y坐标
            allEvent[index].setY(getDataValue(str,AnalyticData.strY));
            //还要更新状态为滑动

        }else if (str.contains(AnalyticData.strTouch)){

            //表示当前是抬起或按下,继续判断
            if (str.contains(AnalyticData.strDown)){
                //如果是按下,当前槽位事件变为按下
                allEvent[index].setEvent(OneEvent.IS_DOWN);
                //按下,可以用的索引增加
                indexSet.add(index);
            } else if (str.contains(AnalyticData.strUp)) {
                //如果是抬起,当前槽位事件变为抬起

                allEvent[index].setEvent(OneEvent.IS_UP);
                //记录状态为抬起
                isUp=true;
            }

        } else if (str.contains(AnalyticData.strReport)) {

            //报告,现在数组的内容可用
            //报告前看看有没有槽位事件为抬起
            //如果有槽位事件为抬起,本次报告完后情况数组
            if (isUp){
                //报告
                report();
                //清空所有(因为屏幕上没有手指了)
                init();
                isUp=false;
            }else {
                report();
            }
            //这里报告完了,所以接下来的按下都是滑动
            toMove();

            //现在可以到达了
            //清空抬起集合
            disposeUp();
        }

    }

    //都变成滑动方法
    private void toMove(){
        for (Integer i : indexSet) {
            allEvent[i].setEvent(OneEvent.IS_MOVE);
        }
    }

    //将准备抬起集合处理一下
    private void disposeUp(){
        //遍历要抬起的集合
        //清除
        for (Integer i : readyUp) {
            allEvent[i]=new OneEvent();
            indexSet.remove(i);
        }
        readyUp=new TreeSet<>();
    }

    //切割字符串获取具体值方法
    //传入要解析的字符串,和类型
    public static int getDataValue(String str,String key){
        //获取最后的值
        String[] strArr =str.split(key);

        String strValue=strArr[strArr.length-1];
        //去除空格
        strValue=strValue.replace(" ","");

        //获取十进制整数值
        int value=AnalyticData.hexToDecimal(strValue);
        //返回
        return value;
    }

    //报告方法(触摸事件可以用就报告)
    private void report(){
        //Log.d("acl","报告");
        for (Integer i : indexSet) {
            //这里会获取一个触摸事件
            //show(allEvent[i]);
            onTouchEventOnce(allEvent[i]);
        }
    }

    //抽象方法,拿到一个事件后要干嘛
    public abstract void  onTouchEventOnce(OneEvent event);

    //初始化数组方法
    public static void init(){
        indexSet=new TreeSet<>();
        allEvent=new OneEvent[10];
        for (int i=0;i<allEvent.length;i++){
            allEvent[i]=new OneEvent();
        }
    }
}
